/*
 * SoftwareSAR - 1.0
 */
package br.com.cpqd.ssar.geradormalha;

import br.com.cpqd.ssar.utilitarias.Triangulo;
import br.com.cpqd.ssar.utilitarias.Vertice;

/**
 * Classe que representa uma linha que liga dois vértices no espaço 3D
 * @author Rafael Buck
 * @version 1.0
 */
public class Edge {

    /**
     * Vértices que definem a linha
     */
    private Vertice[] vertices;

    /**
     * Método Construtor
     * @param triangle Triangulo
     * @param z float
     */
    public Edge(Triangulo triangle, float z) {

        Vertice vertice1, vertice2;              // Vertices auxiliares
        float Xc, Yc, X1, Y1, Z1, X2, Y2, Z2;   // Variaveis da equacao (2) e (3)
        int[] sort;                             // Vetor ordenacao de vertices  |  |  |  |
        int sup, inf;                           // Ponteiros                   inf^     ^sup
        int i;
        boolean flagSup = false;
        boolean flagInf = false;

        // Vertices auxiliares: V1(inferior) e V2(superior)
        vertice1 = new Vertice();        // vertice inferior a z
        vertice2 = new Vertice();        // vertice superior a z
        sort = new int[3];
        inf = 0;                        // inferior no comeco do vetor
        sup = 2;                        // superior no fim do vetor

        // Cria os dois vertices da aresta
        vertices = new Vertice[2];
        vertices[0] = new Vertice();
        vertices[1] = new Vertice();

        for (i = 0; i < 3; i++) {
            if (triangle.getVertice(i).getCoordenada(2) > z) {
                if (flagSup) {
                    sup--;
                }
                sort[sup] = i;
                flagSup = true;
            } else {
                if (flagInf) {
                    inf++;
                }
                sort[inf] = i;
                flagInf = true;
            }
        }

        vertice1 = triangle.getVertice(sort[0]);
        X1 = vertice1.getCoordenada(0);
        Y1 = vertice1.getCoordenada(1);
        Z1 = vertice1.getCoordenada(2);

        vertice2 = triangle.getVertice(sort[2]);
        X2 = vertice2.getCoordenada(0);
        Y2 = vertice2.getCoordenada(1);
        Z2 = vertice2.getCoordenada(2);

        // Primeiro vertice da aresta
        Xc = X1 + ((z - Z1) * (X2 - X1)) / (Z2 - Z1);
        Yc = Y1 + ((z - Z1) * (Y2 - Y1)) / (Z2 - Z1);

        vertices[0].setCoordenada(0, Xc);
        vertices[0].setCoordenada(1, Yc);

        if (sup == 1) {

            vertice2 = triangle.getVertice(sort[1]);
            X2 = vertice2.getCoordenada(0);
            Y2 = vertice2.getCoordenada(1);
            Z2 = vertice2.getCoordenada(2);

        } else if (inf == 1) {

            vertice1 = triangle.getVertice(sort[1]);
            X1 = vertice1.getCoordenada(0);
            Y1 = vertice1.getCoordenada(1);
            Z1 = vertice1.getCoordenada(2);

        }

        // Segundo vertice da aresta
        Xc = X1 + ((z - Z1) * (X2 - X1)) / (Z2 - Z1);
        Yc = Y1 + ((z - Z1) * (Y2 - Y1)) / (Z2 - Z1);

        vertices[1].setCoordenada(0, Xc);
        vertices[1].setCoordenada(1, Yc);

        vertices[0].setCoordenada(2, z);
        vertices[1].setCoordenada(2, z);

    }

    /**
     * Obtém um dos vértices da linha
     * @param i int
     * @return vértice da linha
     */
    public Vertice getElementAt(int i) {
        return vertices[i];
    }
}
